﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;
using GenericEntities;
using System.Windows.Forms;
using System.Data;
using System.Data.OleDb;

namespace DiaryPlanner
{
    class CalendarDB
    {
        private static CalendarDB instance;

        string connectionString = "provider=Microsoft.JET.OLEDB.4.0;" //연결하는 객체의 공급자명(확장자명)
                                        + "data source = "  //데이터 소스=(경로입력하라는거)
                                        + Application.StartupPath ///상대경로 읽어옴
                                        + @"\diaryplannerdb.mdb";//실제 데이터베이스 파일이름

        string commandString = "Select * from [calendar]";//memos테이블에 있는 모든필드들을 모두 검색해라.

        public CalendarDB()
        {

        }

        public static CalendarDB Instance()
        {
            if (instance == null) instance = new CalendarDB();
            return instance;
        }

        public GenericEvent load_db(GenericEvent genericevent)
        {
            try //예외처리문
            {
                OleDbDataAdapter DBAdapter ////DataSet을 채우고 데이터 소스를 업데이트하는 데 사용되는 데이터 명령 집합 및 데이터베이스 연결하게 하는 함수
                    = new OleDbDataAdapter(commandString, connectionString);//connectionString이라는 경로와 쿼리명령을 동적할당

                OleDbCommandBuilder myCommandBuilder ///연결된 데이터베이스에서 DataSet의 변경 내용을 조정하는 데 사용되는 단일 테이블 명령을 자동으로 생성합니다
                    = new OleDbCommandBuilder(DBAdapter);

                DataSet DS = new DataSet(); //DS라는 데이터 셋 동적할당

                DBAdapter.Fill(DS, "calendar"); //DS라는 데이터셋에 새로운 memos 테이블에 추가 또는 갱신하겠다고 알림.

                DataTable aTable = DS.Tables["calendar"];//home테이블을 불러와 aTable을 새로 생성해서 저장

                for (int i = 0; i < aTable.Rows.Count; i++)
                {
                    if (genericevent.StartTime.ToString() == aTable.Rows[i].ItemArray[0].ToString())
                    {
                        if (aTable.Rows[i].ItemArray[5].ToString() == UserProfile.Instance().userId)
                        {
                            genericevent.StartTime = new DateTime(((DateTime)aTable.Rows[i].ItemArray[0]).Ticks);
                            genericevent.EndTime = new DateTime(((DateTime)aTable.Rows[i].ItemArray[1]).Ticks);
                            genericevent.Title = aTable.Rows[i].ItemArray[2].ToString();
                            genericevent.Contents = aTable.Rows[i].ItemArray[3].ToString();
                            genericevent.Location = aTable.Rows[i].ItemArray[4].ToString();

                            return genericevent;
                        }
                    }
                }
            }
            catch (DataException DE) //DataException에러 발생확인하는 catch문
            {
                MessageBox.Show(DE.Message); //DataExpception 에러 발생시 메세지박스로 에러값을 출력해라.
            }
            catch (Exception DE) //Exception에러 발생확인하는 catch문
            {
                MessageBox.Show(DE.Message);//Expception 에러 발생시 메세지박스로 에러값을 출력해라.
            }

            return genericevent;
        }

        public IList loadAll_db()
        {
            IList list = new List<GenericEvent>();

            GenericEvent ge;

            try //예외처리문
            {
                OleDbDataAdapter DBAdapter ////DataSet을 채우고 데이터 소스를 업데이트하는 데 사용되는 데이터 명령 집합 및 데이터베이스 연결하게 하는 함수
                    = new OleDbDataAdapter(commandString, connectionString);//connectionString이라는 경로와 쿼리명령을 동적할당

                OleDbCommandBuilder myCommandBuilder ///연결된 데이터베이스에서 DataSet의 변경 내용을 조정하는 데 사용되는 단일 테이블 명령을 자동으로 생성합니다
                    = new OleDbCommandBuilder(DBAdapter);

                DataSet DS = new DataSet(); //DS라는 데이터 셋 동적할당

                DBAdapter.Fill(DS, "calendar"); //DS라는 데이터셋에 새로운 memos 테이블에 추가 또는 갱신하겠다고 알림.

                DataTable aTable = DS.Tables["calendar"];//home테이블을 불러와 aTable을 새로 생성해서 저장

                for (int i = 0; i < aTable.Rows.Count; i++)
                {
                    if (aTable.Rows[i].ItemArray[5].ToString() == UserProfile.Instance().userId)
                    {
                        ge = new GenericEvent();
                        ge.StartTime = new DateTime(((DateTime)aTable.Rows[i].ItemArray[0]).Ticks);
                        ge.EndTime = new DateTime(((DateTime)aTable.Rows[i].ItemArray[1]).Ticks);
                        ge.Title = aTable.Rows[i].ItemArray[2].ToString();
                        ge.Contents = aTable.Rows[i].ItemArray[3].ToString();
                        ge.Location = aTable.Rows[i].ItemArray[4].ToString();
                        list.Add(ge);
                    }
                }
            }
            catch (DataException DE) //DataException에러 발생확인하는 catch문
            {
                MessageBox.Show(DE.Message); //DataExpception 에러 발생시 메세지박스로 에러값을 출력해라.
            }
            catch (Exception DE) //Exception에러 발생확인하는 catch문
            {
                MessageBox.Show(DE.Message);//Expception 에러 발생시 메세지박스로 에러값을 출력해라.
            }

            return list; 
        }

        public void save_db(GenericEvent genericEvent)
        {
            try //예외처리문
            {
                OleDbDataAdapter DBAdapter ////DataSet을 채우고 데이터 소스를 업데이트하는 데 사용되는 데이터 명령 집합 및 데이터베이스 연결하게 하는 함수
                    = new OleDbDataAdapter(commandString, connectionString);//connectionString이라는 경로와 쿼리명령을 동적할당

                OleDbCommandBuilder myCommandBuilder ///연결된 데이터베이스에서 DataSet의 변경 내용을 조정하는 데 사용되는 단일 테이블 명령을 자동으로 생성합니다
                    = new OleDbCommandBuilder(DBAdapter);

                DataSet DS = new DataSet(); //DS라는 데이터 셋 동적할당

                DBAdapter.Fill(DS, "calendar"); //DS라는 데이터셋에 새로운 memos 테이블에 추가 또는 갱신하겠다고 알림.

                DataTable aTable = DS.Tables["calendar"];//memos테이블을 불러와 aTable을 새로 생성해서 저장
                DataRow newRow = aTable.NewRow();

                newRow["Sdate"] = genericEvent.StartTime;
                newRow["Edate"] = genericEvent.EndTime;
                newRow["title"] = genericEvent.Title;
                newRow["contents"] = genericEvent.Contents;
                newRow["location"] = genericEvent.Location;
                newRow["id"] = UserProfile.Instance().userId;

                aTable.Rows.Add(newRow);

                DBAdapter.Update(DS, "calendar");
            }
            catch (DataException DE)
            {
                MessageBox.Show(DE.Message);
            }
            catch (Exception DE)
            {
                MessageBox.Show(DE.Message);
            }
        }

        public void update_db(GenericEvent oldGe, GenericEvent newGe)
        {
            int idx = 0;

            try
            {
                OleDbDataAdapter DBAdapter ////DataSet을 채우고 데이터 소스를 업데이트하는 데 사용되는 데이터 명령 집합 및 데이터베이스 연결하게 하는 함수
                    = new OleDbDataAdapter(commandString, connectionString);//connectionString이라는 경로와 쿼리명령을 동적할당

                OleDbCommandBuilder myCommandBuilder ///연결된 데이터베이스에서 DataSet의 변경 내용을 조정하는 데 사용되는 단일 테이블 명령을 자동으로 생성합니다
                    = new OleDbCommandBuilder(DBAdapter);

                DataSet DS = new DataSet(); //DS라는 데이터 셋 동적할당

                DBAdapter.Fill(DS, "calendar"); //DS라는 데이터셋에 새로운 memos 테이블에 추가 또는 갱신하겠다고 알림.

                DataTable aTable = DS.Tables["calendar"];//memos테이블을 불러와 aTable을 새로 생성해서 저장

                DataColumn[] PrimaryKey = new DataColumn[1];

                PrimaryKey[0] = aTable.Columns["idx"]; //a컬럼을 기본키를 설정

                aTable.PrimaryKey = PrimaryKey;//기본키 할당

                for (int i = 0; i < aTable.Rows.Count; i++)
                {
                    if (oldGe.StartTime == new DateTime(((DateTime)aTable.Rows[i].ItemArray[0]).Ticks) &&
                        oldGe.EndTime == new DateTime(((DateTime)aTable.Rows[i].ItemArray[1]).Ticks) &&
                        oldGe.Title == aTable.Rows[i].ItemArray[2].ToString() &&
                        oldGe.Contents == aTable.Rows[i].ItemArray[3].ToString() &&
                        oldGe.Location == aTable.Rows[i].ItemArray[4].ToString() &&
                        UserProfile.Instance().userId == aTable.Rows[i].ItemArray[5].ToString()
                        )

                        idx = int.Parse(aTable.Rows[i].ItemArray[6].ToString());
                }

                DataRow currRow = aTable.Rows.Find(idx); //textBox값인 기본키 선택                
                currRow.BeginEdit(); //수정을 할 부분 시작 설정

                currRow["Sdate"] = newGe.StartTime;
                currRow["Edate"] = newGe.EndTime;
                currRow["title"] = newGe.Title;
                currRow["contents"] = newGe.Contents;
                currRow["location"] = newGe.Location;
                currRow.EndEdit(); //수정할 부분 끝 부분 설정
                DataSet UpdateSet = DS.GetChanges(DataRowState.Modified); //데이터 상태를 수정한다.
                if (UpdateSet.HasErrors)
                {
                    MessageBox.Show("변경된 데이터에 문제가 있습니다.");
                }
                else
                {
                    DBAdapter.Update(DS, "calendar");
                    DS.AcceptChanges(); //실제 데이터를 생성
                }
            }
            catch (DataException DE)
            {
                MessageBox.Show(DE.Message);
            }
            catch (Exception DE)
            {
                MessageBox.Show(DE.Message);
            }
        }

        public void del_db(GenericEvent genericEvent)
        {
            int idx = 0;
            try
            {
                OleDbDataAdapter DBAdapter ////DataSet을 채우고 데이터 소스를 업데이트하는 데 사용되는 데이터 명령 집합 및 데이터베이스 연결하게 하는 함수
                    = new OleDbDataAdapter(commandString, connectionString);//connectionString이라는 경로와 쿼리명령을 동적할당

                OleDbCommandBuilder myCommandBuilder ///연결된 데이터베이스에서 DataSet의 변경 내용을 조정하는 데 사용되는 단일 테이블 명령을 자동으로 생성합니다
                    = new OleDbCommandBuilder(DBAdapter);

                DataSet DS = new DataSet(); //DS라는 데이터 셋 동적할당

                DBAdapter.Fill(DS, "calendar"); //DS라는 데이터셋에 새로운 memos 테이블에 추가 또는 갱신하겠다고 알림.

                DataTable aTable = DS.Tables["calendar"];//memos테이블을 불러와 aTable을 새로 생성해서 저장

                DataColumn[] PrimaryKey = new DataColumn[1];

                PrimaryKey[0] = aTable.Columns["idx"]; //a컬럼을 기본키를 설정

                aTable.PrimaryKey = PrimaryKey;//기본키 할당

                for (int i = 0; i < aTable.Rows.Count; i++)
                {

                    if (genericEvent.StartTime == new DateTime(((DateTime)aTable.Rows[i].ItemArray[0]).Ticks) &&
                        genericEvent.EndTime == new DateTime(((DateTime)aTable.Rows[i].ItemArray[1]).Ticks) &&
                        genericEvent.Title == aTable.Rows[i].ItemArray[2].ToString() &&
                        genericEvent.Contents == aTable.Rows[i].ItemArray[3].ToString() &&
                        genericEvent.Location == aTable.Rows[i].ItemArray[4].ToString() &&
                        UserProfile.Instance().userId == aTable.Rows[i].ItemArray[5].ToString()
                        )

                        idx = int.Parse(aTable.Rows[i].ItemArray[6].ToString());
                }
                DataRow currRow1 = aTable.Rows.Find(idx); //textBox값인 기본키 선택
                currRow1.Delete(); //삭제

                DBAdapter.Update(DS.GetChanges(DataRowState.Deleted), "calendar");
            }
            catch (DataException DE)
            {
                MessageBox.Show(DE.Message);
            }
            catch (Exception DE)
            {
                MessageBox.Show(DE.Message);
            }
        }

        public void initLogin()
        {
            try
            {
                string connectionString = "provider=Microsoft.JET.OLEDB.4.0;" //연결하는 객체의 공급자명(확장자명)
                                         + "data source = "  //데이터 소스=(경로입력하라는거)
                                         + Application.StartupPath ///상대경로 읽어옴
                                         + @"\diaryplannerdb.mdb";//실제 데이터베이스 파일이름

                string commandString = "Select * from [google]";//google테이블에 있는 모든필드들을 모두 검색해라.

                OleDbDataAdapter DBAdapter ////DataSet을 채우고 데이터 소스를 업데이트하는 데 사용되는 데이터 명령 집합 및 데이터베이스 연결하게 하는 함수
                    = new OleDbDataAdapter(commandString, connectionString);//connectionString이라는 경로와 쿼리명령을 동적할당

                OleDbCommandBuilder myCommandBuilder ///연결된 데이터베이스에서 DataSet의 변경 내용을 조정하는 데 사용되는 단일 테이블 명령을 자동으로 생성합니다
                    = new OleDbCommandBuilder(DBAdapter);

                DataSet DS = new DataSet(); //DS라는 데이터 셋 동적할당

                DBAdapter.Fill(DS, "google"); //DS라는 데이터셋에 새로운 memos 테이블에 추가 또는 갱신하겠다고 알림.

                DataTable aTable = DS.Tables["google"];//memos테이블을 불러와 aTable을 새로 생성해서 저장

                DataColumn[] PrimaryKey = new DataColumn[1];

                PrimaryKey[0] = aTable.Columns["id"]; //a컬럼을 기본키를 설정

                aTable.PrimaryKey = PrimaryKey;//기본키 할당

                DataRow currRow = aTable.Rows.Find(UserProfile.Instance().userId);
                if (currRow == null) return;
                UserProfile.Instance().connection = Boolean.Parse(currRow["con"].ToString());

                if (UserProfile.Instance().connection)
                {
                    CalendarConnection.Instance().login(currRow["Gid"].ToString(), currRow["pass"].ToString());
                    CalendarConnection.Instance().syncCalandar();
                }
            }
            catch (DataException e)
            {
                MessageBox.Show(e.ToString());
            }
            catch (Exception e)
            {
                MessageBox.Show(e.ToString());
            }
        }
    }
}
